﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;

namespace IlGenUtil
{
	// TODO: спрятать конcтруктор за интерфейсом
	public struct IlGen<Stack, Args, Ret>
	{
		public readonly ILGenerator il;

		public IlGen(ILGenerator il)
		{
			this.il = il;
		}

		public Label DefineLabel()
		{
			return this.il.DefineLabel();
		}

		public IlGen<Stack, Args, Ret> MarkLabel(Label l)
		{
			this.il.MarkLabel(l);
			return this;
		}

		/// <summary>Объявление новой локальной переменной.</summary>
		/// <typeparam name="T">Тип переменной</typeparam>
		public Var<T> DeclareLocal<T>()
		{
			return new _Var<T>(this.il);
		}

		private struct _Var<T> : Var<T>
		{
			public LocalBuilder v { get { return this._v; } }
			private readonly LocalBuilder _v;

			public _Var(ILGenerator il)
			{
				this._v = il.DeclareLocal(typeof(T));
			}
		}
	}
}
